home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / mem / staticfree.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-12  |  2.2 KB  |  107 lines

  1.  
  2. #include "tek/mem.h"
  3.  
  4. /* 
  5. **    TEKlib
  6. **    (C) 2001 TEK neoscientists
  7. **    all rights reserved.
  8. **
  9. **    TVOID TStaticFree(TMEMHEAD *head, TAPTR mem)
  10. **
  11. **    free memory allocated from a static allocator.
  12. */
  13.  
  14. TVOID TStaticFree(TMEMHEAD *head, TAPTR mem)
  15. {
  16.     if (head && mem)
  17.     {
  18.         TMEMNODE *p = (TMEMNODE *) ((TUINT8 *) mem - head->memnodesize);
  19.  
  20.         if (p->next)
  21.         {
  22.             /* not end node */
  23.             
  24.             head->freesize += p->size - p->free;
  25.             p->free = p->size;
  26.  
  27.             if (p->next->size == p->next->free)
  28.             {
  29.                 head->freesize += head->memnodesize;
  30.                 p->size += head->memnodesize + p->next->size;
  31.                 p->free += head->memnodesize + p->next->size;
  32.                 p->next = p->next->next;
  33.                 if (p->next)
  34.                 {
  35.                     p->next->prev = p;
  36.                 }
  37.             }
  38.  
  39.             if (p->prev)
  40.             {
  41.                 if (p->prev->free == p->prev->size)
  42.                 {
  43.                     p->prev->size += p->size + head->memnodesize;
  44.                     p->prev->free += p->size + head->memnodesize;
  45.                     p->prev->next = p->next;
  46.                     p->next->prev = p->prev;
  47.                     head->freesize += head->memnodesize;
  48.                     p = p->prev;
  49.                 }
  50.             }
  51.             
  52.             if (p->prev)
  53.             {
  54.                 if (p->prev->free)
  55.                 {
  56.                     /* 
  57.                     **        move node and concatenate with
  58.                     **        leftover space at the previous node.
  59.                     **
  60.                     **        ||***.||*****||*||
  61.                     **    ->    ||***||......||*||
  62.                     */                    
  63.  
  64.                     TUINT psize = p->size;
  65.                     TMEMNODE *pprev = p->prev, *pnext = p->next;
  66.                     TMEMNODE *n = (TMEMNODE *) ((TUINT8 *)p->prev + head->memnodesize + p->prev->size - p->prev->free);
  67.  
  68.                     pprev->size -= pprev->free;
  69.                     n->prev = pprev;
  70.                     n->next = pnext;
  71.                     pnext->prev = n;
  72.                     pprev->next = n;
  73.                     n->size = psize + pprev->free;
  74.                     n->free = n->size;
  75.                     pprev->free = 0;
  76.                 }
  77.             }
  78.         }
  79.         else
  80.         {
  81.             /* end node */
  82.  
  83.             if (p->prev)
  84.             {
  85.                 p->prev->next = TNULL;
  86.                 p->prev->size += p->size + head->memnodesize;
  87.                 p->prev->free += p->size + head->memnodesize;
  88.  
  89.                 head->freesize += p->size - p->free + head->memnodesize;
  90.                             
  91.                 if (p->prev->free == p->prev->size && p->prev->prev)
  92.                 {
  93.                     p->prev->prev->size += p->prev->size + head->memnodesize;
  94.                     p->prev->prev->free += p->prev->size + head->memnodesize;
  95.                     p->prev->prev->next = TNULL;
  96.                     head->freesize += head->memnodesize;
  97.                 }
  98.             }
  99.             else
  100.             {
  101.                 head->freesize += p->size - p->free;
  102.                 p->free = p->size;
  103.             }
  104.         }
  105.     }
  106. }
  107.